WordPress Get Post by Slug(post_name)

Categories: Development NotesPHPWordPress; Tagged with: ; @ July 19th, 2010 20:43

需求: 依照Slug获得Post.

解决方案: API只有getPost(by ID), 我们要创建一个getPostBySlug. (Slug具有唯一性, 可参见表wp_posts,post_name 及有关代码)

Get Post by Slug:

作者: http://www.thiendo.com/blog/wordpress/253-wordpress-get-post-by-slug/

<?php
     function get_post_by_slug($post_name, $output = OBJECT)
     {
         global $wpdb;
         $post = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type='post'", $post_name ));
         if ( $post )
             return get_post($post, $output);

         return null;
     }
?>

对于英文的地址来说, 以上代码可以很好的工作, 但如果slug是中文, 就无法工作了, 无法Select到任何东西. 经过Debug, 发现如果slug为中文, 将不会进行任何Select. 如果不使用prepare, 直接使用qury, 则可解决, 解决后的代码:

/**
 * WP integration: 根据Slug/Post_name返回PostID, 交由后续程序继续处理.
 * 不直接返回Post的原因是API中getpost()还有很多额外操作, 因此如果需要获得Post, 则可使用: get_post($id);
 * @param $post_name slug
 * @param $output 对应post的ID
 * @return Integer
 */
function wpi_get_post_id_by_slug($post_name, $output = OBJECT) {
         global $wpdb;
         $sql = "SELECT ID FROM $wpdb->posts WHERE post_name = '" . urlencode($post_name) . "' AND post_type='post'";
         $postID = $wpdb->get_var($sql);
         
         return $postID;
}

<->



// Proudly powered by Apache, PHP, MySQL, WordPress, Bootstrap, etc,.